package Stream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/*
1.获取Stream流
        一.集合获取Stream流对象:
                  1.单列集合:直接调用stream()方法
                  2.双列集合:keySet().stream(),获取所有键的流对象
                            values().stream(),获取所有值的流对象
                          **entryaSet().stream(),获取所有键值对的流对象
        二.数组获取Stream流对象:
                  借助工具类Arrays中的stream()方法
        三.零散数据(不在数组也不在集合)获取Stream流对象:
                  借助Stream类中的of()方法添加
2.中间方法:
        filter():过滤元素
        limit():获取前几个元素
        skip():跳过前几个元素
        distinct():去除重复元素(依赖hashCode()和equals())
        concat():合并两个流
     os:流对象被使用一次后,就不允许再次使用

3.终结方法:返回的不再是Stream对象,方法结束
        1.forEach():遍历元素
        2.count():返回元素个数

stream收集操作:调用collect()方法,收集处理后数据.传入的是对象,不用实现,通过调用Collectors中方法
                1.collect(Collectors.toList()):存进List集合
                2.collect(Collectors.toSet()):存进Set集合
                3.collect(Collectors.toMap(实现类1,实现类2)):存进Map集合,




 */
public class StreamDemo {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        Collections.addAll(list,"张三","李四","张三丰","张无极","王五","王五");
        //收集数据存进List集合
        List<String> collectList = list.stream().skip(2).collect(Collectors.toList());
        //收集数据存进Set集合
        Set<String> collectSet = list.stream().skip(3).collect(Collectors.toSet());
        //收集数据存进Map集合,见Test2

    }
        //2.中间方法
    private static void mideeleMethod(List<String> list) {
        //过滤元素
        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("张");
            }
        }).forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        System.out.println("----");
        //获取前3个元素
        list.stream().limit(3).forEach(s-> System.out.println(s));
        System.out.println("----");
        //跳过元素
        list.stream().skip(2).forEach(s-> System.out.println(s));
        System.out.println("----");
        //去除重复元素
        list.stream().distinct().forEach(s-> System.out.println(s));
        System.out.println("----");
        //合并流
        Stream<String> s1 = list.stream().limit(2);
        Stream<String>s2= list.stream().skip(3);
        Stream<String> s3 = Stream.concat(s1, s2);

        s3.skip(2).forEach(s-> System.out.println(s));

    }
}
